「网络流24题」搭配飞行员 (二分图匹配) Posted on 2018-09-14 | In ACM , LOJ , 网络流 经典的二分图的最大匹配问题 题目链接 题解 匈利亚算法显然是可以解决的 最大流的做法是建一个超级源点和超级汇点,超级源点和正驾驶之间建一条流量为$1$的边,超级源点和副驾驶之间建一条流量为$1$的边,跑最大流即可 代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172// 二分图做法#include<bits/stdc++.h>using namespace std;typedef unsigned long long ll;const int maxn = 2000;int head[maxn], nxt[maxn], to[maxn] ,tot;int vis[maxn], p[maxn];int n, m;vector<int>g;void init(){ tot=0; memset(nxt,0, sizeof(nxt)); memset(head, 0 , sizeof(head));}void addedge(int u,int v){ to[++tot]=v; nxt[tot]=head[u]; head[u]=tot;}bool Hungarian(int x){ for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(!vis[v]) { vis[v]=1; if(!p[v] || Hungarian(p[v])) { p[v]=x; return true; } } } return false;}int Maxmatch(){ memset(p, 0, sizeof(p)); int cnt=0; for(int i=0;i<int(g.size());i++) { memset(vis, 0, sizeof(vis)); if(Hungarian(g[i])) cnt++; } return cnt;}int main(){ scanf("%d%d", &n, &m); int u, v; while(scanf("%d%d", &u, &v)!=EOF) { addedge(u,v); addedge(v,u); if(!vis[u]) g.push_back(u); vis[u]=1; } printf("%d\n", Maxmatch());}